import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * @Author Stringzhua
 * @Date 2024/9/26 18:47
 * description:
 * 给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
 * <p>
 * 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
 * 是由重新排列源单词的所有字母得到的一个新单词
 * 如:
 * "ate","eat","tea"
 * "nat","tan"
 * 判断以处理的字母是否存在
 * 字典排序
 * Arrays.sort(chars)
 * <p>
 * 示例 1:
 * <p>
 * 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
 * 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
 * 示例 2:
 * <p>
 * 输入: strs = [""]
 * 输出: [[""]]
 * 示例 3:
 * <p>
 * 输入: strs = ["a"]
 * 输出: [["a"]]
 * <p>
 * <p>
 * 提示：
 * <p>
 * 1 <= strs.length <= 104
 * 0 <= strs[i].length <= 100
 * strs[i] 仅包含小写字母
 */
public class lc49p2 {
    public List<List<String>> groupAnagrams(String[] strs) {
        HashMap<Word, List<String>> map = new HashMap<>();
        for (String key : strs) {
            Word w = new Word(key);
            if (map.containsKey(w)) {
                map.get(w).add(key);
            } else {
                List<String> s = new ArrayList<>();
                s.add(key);
                map.put(w, s);
            }
        }
        return new ArrayList<>(map.values());
    }

    class Word {
        int[] counts;

        Word(String s) {
            final char[] chars = s.toCharArray();
            counts = new int[26];
            for (char c : chars) {
                int index = c - 'a';
                counts[index]++;
            }
        }

        public boolean equals(Object o) {
            return Arrays.equals(counts, ((Word) o).counts);
        }

        public int hashCode() {
            return Arrays.hashCode(counts);
        }
    }
}
